UE4后期处理材质的一些应用(上) 您所在的位置:网站首页 ue4 剔除 UE4后期处理材质的一些应用(上)

UE4后期处理材质的一些应用(上)

2024-02-24 16:02| 来源: 网络整理| 查看: 265

       自己学习时的一些见解,由于篇幅较长,只能分成上下两部分分开投稿,希望对刚开始学习UE4后期处理材质的朋友有所帮助

(由于图片上传的原因,评论有人反应清晰度不行,这里贴一个网盘链接,里面是所有用到的图片,有需要自取)

链接:https://pan.baidu.com/s/10pyB7gZQx-l_S4eSAEcBxw 提取码:1234

一、后期处理材质简介1、后期处理材质的作用

       后期处理材质使您能够设置与后期处理一起使用的材质,以创建破坏的视觉屏幕效果、区域类型效果或只能通过后置处理材质才能实现的游戏整体外观

2、如何使用后期处理材质

       在场景中添加后期处理体积PostProcessVolume(类比AE的话,相当于加了一个调整图层)

       在渲染功能中点开后期处理材质,添加数组元素,选择资产引用,为数组元素添加后期处理材质(这一步相当于给调整图层增加效果)

       放大后期处理体积(使视角摄像头在其范围内)或在后期处理体积设置中勾选无限范围,即可看到添加后期处理材质后的场景变化(这一步相当于给调整图层遮罩大小,控制效果产生影响的范围)

使用后期处理材质前使用后期处理材质后

二、创建不同的后期处理材质1、自定义深度通道遮罩

       首先创建一个材质球

       在材质参数中修改材质域为后期处理

       往下拉,在可混合位置修改为色调映射前(可解决画面抖动、锯齿等问题)

       SceneTexture(场景纹理):这个节点输入UV值,你可以获取到这个UV对应的像素点的各个属性,比如SceneColor(场景颜色),SceneDepth(场景深度),CustomDepth(自定义深度)等等,如果不输入UV,则默认为对所有像素点都做一样的处理

       在节点面板右击创建SceneTexture(场景纹理)节点

       修改此节点的场景纹理ID为自定义模具(用来获取场景中开启自定义模具的物体在画面中的纹理信息)

       连接至自发光颜色并保存

       回到主界面,选中需要提取遮罩的物体

       在物体细节面板打开渲染自定义深度通道,默认自定义深度模具值为0

       根据前面的《如何使用后期处理材质》,添加后期处理体积(PostProcessVolume),引用刚刚做好的后期处理材质,并开启无限距离后对比前后变化

使用后期处理材质前使用后期处理材质后

       屏幕全是黑色,并没有高亮出我们选择的物体,这是因为我们给自定义深度模具值为0,所以SceneTexture自定义模具对我们选择的物体在屏幕中的位置输出的颜色数值为4维数组(0,0,0,0),分别对应RGBA,我们把自定义深度模具值改为1后再次观察前后变化

       现在正确的把我们选择的物体显示出来了,SceneTexture自定义模具对我们选择的物体在屏幕中的位置输出的4维颜色数组为(1,1,1,1),那么举一反三,当我们把自定义深度模具值调的越大,自发光的亮度应该越亮,我们把自定义深度模具值改为10后看看变化

       和我们推理的结果一致,这个方法可以给我们指定的物体生成黑白蒙版遮罩,且不同的自定义模具值可以提供不同的4维颜色数组,所以可以用自定义深度模具值来处理复杂的情况,等于把开启了自定义深度的物体进行了分级

2、遮挡物体描边显示

       在很多游戏中为了玩家能看到墙面背后是否有敌人,会给被遮挡的敌人增加描边显示,下面我们就来做一下这个效果

       首先要找到物体的边缘边界,假设这是场景的自定义深度图,每一格是一个像素,里面存放着各个像素点的自定义深度值

       我们看到的物体内部是蓝色数值,红色的就是我们需要的边,正无穷就是没有开启自定义深度的物体外部

判定物体的边有很多种方法,我们要先搞清楚以下几点:

       a.物体的内部:可以获取到自定义深度的数值,上下左右4个像素点都可以获取自定义深度

       b.物体的边缘:可以获取到自定义深度的数值,上下左右4个像素点不全都能获取到自定义深度

       c.物体的外部:自定义深度的数值为正无穷,上下左右4个像素点不全都能获取到自定义深度

       通过上述规律,我们可以用这种方法确定物体的边界:当一个像素点自身的自定义深度值不为正无穷,但上下左右四个像素点的和却为正无穷时,这个像素点就是物体的边(UE4中没有正无穷,所以用一个很大的数来近似判定是否为正无穷)

       而在UE4中SceneTextureCustomDepth(自定义深度)就是用来输出这张图的

       但是直接连接的话由于数值都大于1,所以都显示为白色,需要除以一个很大的数来把数值控制在0-1之间才能正确显示我们需要的结果

       这里我们用Divide节点,把自定义深度除以1000万

       这样就得到了我们需要的自定义深度图

       了解了原理后,我们开始制作物体描边后期处理材质,与《自定义深度通道遮罩》中一样,创建一个新的材质球,在参数中修改为后期处理与色调映射前

       先创建一个ScreenPosition(屏幕位置)节点,ScreenPosition的原点在屏幕左上角

       ViewportUV输出的是每个像素点在屏幕上的UV值(2维数组),取值范围是0~1,等于是每个像素点的UV都获取一次,然后进行处理,连接到自发光可以看到,横坐标为R值纵坐标为G值,右上角为(1,0)显示红色,左下角为(0,1)显示绿色,右下角为(1,1)显示黄色(红+绿为黄色)

       PixelPosition输出的是每个像素点在屏幕上的位置坐标,取值范围是0~屏幕尺寸,直接连接到自发光可以看到画面偏亮,但不是纯白色

       而当我们把这个值除以1000后,画面的颜色与ViewportUV接近

       我们再创建一个SceneTexelSize(场景纹素大小),这也是一个2维数组的值,对应着UV(u,v),uv均为正数,这里u就代表着要在横向偏移一个像素单位需要增加或者减少多少,v也同理

       比如你的屏幕是1920*1080的,那么你屏幕的横向上就有1920个像素,U的取值区间是0~1,那么横向上每个像素就占1/1920≈0.000521,同理纵向上每个像素就占1/1080≈0.000926,那么SceneTexelSize的值就为(0.000521,0.000926)。

       举个例子,比如现在有个像素点的uv为(0.2,0.6),那么这个像素上方的像素点则为

(0.2,0.6-0.000926),下方则为(0.2,0.6+0.000926),左右同理(因为UE4中uv坐标系原点在左上角,所以这里向上为减,向下为加)

       上述的结论可以由PixelPosition与SceneTexelSize相乘得到的结果验证

             SceneTexture:PostProcessInput0(后期处理输入0)节点:这个节点其实就是SceneColor(场景本来的颜色),而SceneColor只能用于材质域为Surface(表面)的材质,所以这里用的是SceneTexture:后期处理输入0

       理解了这些节点之后,我们就可以通过这些节点来计算出各个自定义深度像素点的上下左右4个像素点之和了

       然后我们再把算出来的和跟一个近似无穷大的数作比较,如果大于近似无穷大的数则为自定义模具物体的边与外部,给它一个颜色值(这里我用了黄色),如果小于近似无穷大的数则为自定义模具物体内部,给它场景原本的颜色

       从上到下依次是:+u(右侧像素点),-u(左侧像素点),+v(下方像素点),-v(上方像素点)

       这里给了一个Width(宽度)参数,这个参数和SceneTexelSize相乘,就可以调节描边的粗细了(即通过改变偏移的像素数量来控制描边粗细)

       这里的自定义深度输出的值是Color,而Color代表的是一个4维数组,有RGBA四个值,当使用自定义深度时,我们只需要一个值(自定义深度图是一个黑白图,数组中的每个数字都相同),可以用Mask节点取到第一个R值

       同理,SceneTexturePostProcessInput0节点我们只需要取前三个值,因为后处理材质只有一个属性EmissiveColor(自发光颜色),这是个3维数组的值,只需要三个控制颜色的RGB值,不需要透明度(虽然4个数值也能连接使用,但是这样可以节省计算浪费,也可以避免出错)

       结果上可以看到,现在把画面分割成了自定义模具物体内部显示的是原本的颜色,物体外部与物体边缘显示的是描边颜色,现在我们需要把物体外部排除掉,让它也显示为原本的颜色

       这里的方法比较多,我们采用《自定义深度模具遮罩》学习的内容来实现,让它作为亮度蒙版与现有结果做一个Lerp差值混合,蒙版内部(即白色部分)为现有结果,蒙版外部(即黑色部分)为原本的颜色(蒙版外部排除掉之后,实际上就是一个内描边)

       现在的结果就和我们需要的比较接近了,但是我们只需要被遮挡的部分显示描边,没有被遮挡的部分不显示描边,这里需要通过其他节点来判断是否被遮挡

       SceneDepth(场景深度):当前画面上的像素点和摄像机之间的距离,这是从你看得到的地方开始算的,比如镜头正对着一面墙,墙后有个自定义模具Cube,那么UV(0.5,0.5)获取到的场景深度就是黑色虚线(墙到摄像机之间的距离),跟Cube无关

       CustomDepth(自定义深度):想获得被遮挡的物体离相机的距离,要开启物体上的自定义深度通道,如果在UV对应的像素点方向上有物体开启了自定义深度,即使被遮挡也可以获取到它的场景深度。如果该位置没有物体开启自定义深度,那么得到的值则是无穷大。

       所以我们就可以根据自定义深度(绿色虚线)和场景深度(黑色虚线)的差值来判断是否有东西被挡住(如果有两个开启了自定义深度通道的物体在一条线上的话,那么获取到的CustomDepth是离摄像机更近的那个)

CustomDepth自定义深度-SceneDepth场景深度

       如果开启CustomDepth被挡住,那么CustomDepth>SceneDepth,CustomDepth-SceneDepth=有限值

       如果开启CustomDepth没被挡住,那么CustomDepth=SceneDepth

       如果没有开启CustomDepth,那么CustomDepth-SceneDepth=无穷大

       我们可以用if节点判断CustomDepth-SceneDepth的结果。当结果



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有